const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const fs = require('fs');

// 数据库路径
const dbPath = path.join(__dirname, 'data/pph.sqlite');
const backupPath = path.join(__dirname, 'data/pph_backup_' + new Date().toISOString().slice(0,10) + '.sqlite');

console.log('🔧 PPH数据库迁移工具');
console.log('📍 数据库路径:', dbPath);
console.log('💾 备份路径:', backupPath);

// 包装 sqlite3 为 Promise
function dbQuery(db, sql, params = []) {
  return new Promise((resolve, reject) => {
    if (sql.trim().toUpperCase().startsWith('SELECT') || sql.trim().toUpperCase().startsWith('PRAGMA')) {
      db.all(sql, params, (err, rows) => {
        if (err) reject(err);
        else resolve(rows);
      });
    } else {
      db.run(sql, params, function(err) {
        if (err) reject(err);
        else resolve({ changes: this.changes, lastID: this.lastID });
      });
    }
  });
}

async function runMigration() {
  try {
    // 1. 检查数据库文件是否存在
    if (!fs.existsSync(dbPath)) {
      console.log('❌ 数据库文件不存在:', dbPath);
      return;
    }

    // 2. 创建备份
    console.log('\n📋 步骤1: 创建数据库备份...');
    fs.copyFileSync(dbPath, backupPath);
    console.log('✅ 备份完成:', backupPath);

    // 3. 连接数据库
    console.log('\n📋 步骤2: 连接数据库...');
    const db = new sqlite3.Database(dbPath);

    // 4. 检查当前表结构
    console.log('\n📋 步骤3: 检查当前表结构...');
    const tableInfo = await dbQuery(db, "PRAGMA table_info(pph_records)");
    console.log('当前字段列表:');
    tableInfo.forEach(col => {
      console.log(`  - ${col.name}: ${col.type} (nullable: ${col.notnull === 0})`);
    });

    // 检查是否已有 is_main_product 字段
    const hasMainProduct = tableInfo.some(col => col.name === 'is_main_product');
    const hasNonMainProduct = tableInfo.some(col => col.name === 'is_non_main_product');

    if (hasMainProduct) {
      console.log('⚠️  is_main_product 字段已存在，跳过迁移');
      db.close();
      return;
    }

    if (!hasNonMainProduct) {
      console.log('⚠️  is_non_main_product 字段不存在，无需迁移');
      db.close();
      return;
    }

    // 5. 检查现有数据
    console.log('\n📋 步骤4: 检查现有数据...');
    const dataCheck = await dbQuery(db, `
      SELECT
        is_non_main_product,
        COUNT(*) as count
      FROM pph_records
      GROUP BY is_non_main_product
      ORDER BY is_non_main_product
    `);

    console.log('现有数据分布:');
    dataCheck.forEach(row => {
      const meaning = row.is_non_main_product === 0 ? '主打产品' :
                     row.is_non_main_product === 1 ? '非主打产品' : '未设置';
      console.log(`  - is_non_main_product = ${row.is_non_main_product} (${meaning}): ${row.count} 条记录`);
    });

    // 6. 开始迁移
    console.log('\n📋 步骤5: 开始数据迁移...');

    // 6.1 添加新列
    console.log('  6.1 添加 is_main_product 列...');
    await dbQuery(db, 'ALTER TABLE pph_records ADD COLUMN is_main_product INTEGER');

    // 6.2 数据转换
    console.log('  6.2 转换数据（反转逻辑）...');
    const updateResult = await dbQuery(db, `
      UPDATE pph_records
      SET is_main_product = CASE
          WHEN is_non_main_product = 0 THEN 1
          WHEN is_non_main_product = 1 THEN 0
          ELSE NULL
      END
    `);

    console.log(`  ✅ 更新了 ${updateResult.changes} 条记录`);

    // 7. 验证迁移结果
    console.log('\n📋 步骤6: 验证迁移结果...');
    const verifyData = await dbQuery(db, `
      SELECT
        is_non_main_product,
        is_main_product,
        COUNT(*) as count
      FROM pph_records
      GROUP BY is_non_main_product, is_main_product
      ORDER BY is_non_main_product
    `);

    console.log('迁移后数据对比:');
    verifyData.forEach(row => {
      const oldMeaning = row.is_non_main_product === 0 ? '主打' :
                        row.is_non_main_product === 1 ? '非主打' : '未设置';
      const newMeaning = row.is_main_product === 1 ? '主打' :
                        row.is_main_product === 0 ? '非主打' : '未设置';
      console.log(`  - 旧字段: ${row.is_non_main_product}(${oldMeaning}) → 新字段: ${row.is_main_product}(${newMeaning}) | ${row.count} 条`);
    });

    // 8. 检查是否有数据不一致
    const inconsistent = await dbQuery(db, `
      SELECT COUNT(*) as count FROM pph_records
      WHERE (is_non_main_product = 0 AND is_main_product != 1)
         OR (is_non_main_product = 1 AND is_main_product != 0)
    `);

    if (inconsistent[0].count > 0) {
      console.log(`❌ 发现 ${inconsistent[0].count} 条数据转换异常！`);
      db.close();
      return;
    }

    console.log('✅ 数据转换验证通过！');

    // 9. 关闭数据库连接
    db.close();
    
    console.log('\n🎉 数据库迁移完成！');
    console.log('📝 下一步: 更新代码以使用 is_main_product 字段');
    console.log('⚠️  注意: 旧字段 is_non_main_product 仍然保留，代码更新完成后可手动删除');

  } catch (error) {
    console.error('❌ 迁移失败:', error.message);
    console.log('💡 可以从备份恢复:', backupPath);
  }
}

// 执行迁移
runMigration();
